<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        //1. 构造函数解决性能问题 
        // function Person(name){
        //     this.name = name;
        //     this.hobby = function(){
        //         console.log("喜欢篮球");
        //     }
        // }

        // let zhangsan = new Person("张三");
        // let lisi = new Person("李四");
        // // zhangsan.hobby();
        // // lisi.hobby();
        // console.log(zhangsan.hobby===lisi.hobby);

        // 在构造函数里 提供一个公共空间存放相同的方法，不会开辟新的内容地址；
        // 这样一个公共空间就是 prototype叫原型； 每个构造函数都会自动有一个原型；

        // function Person(name){
        //     this.name = name;
        // }
        // //  Person.prototype 就是Person构造函数的原型，就是一个公共空间
        // // prototype里存放的东西是所有对象所共有的；
        // Person.prototype.hobby = function(){
        //     console.log("喜欢篮球");
        // }
        // let zhangsan = new Person("张三");
        // let lisi = new Person("李四");
        // zhangsan.hobby();
        // lisi.hobby();
        // console.log(zhangsan.hobby===lisi.hobby);

        // 原型需要注意的地方：
        // 1.一般 我们会把属性放在 构造函数里面 ，把方法放在 原型上；
        // 2.会把方法放在 构造函数的原型（prototype）上
        // function Person(name){  // 构造函数 
        //     this.name =name;   //属性
        //     this.age = 20; //属性
        // }
        // // Person.prototype 是构造函数 Person的原型；
        // Person.prototype.hobby = function(){
        //     console.log("喜欢篮球");
        // }
        //  3.实例化出来的对象 由构造函数和原型里的内容共同构成；

        // function Person(name) {  // 构造函数 
        //     this.name = name;   //属性
        //     this.age = 20; //属性
        // }
        // // Person.prototype 是构造函数 Person的原型；
        // Person.prototype.hobby = function () {
        //     console.log("喜欢篮球");
        // }
        // let zhangsan = new Person("张三");
        // 4. 原型里的this指向实例化对象:简单来说原型方法里的this和构造函数里的this是共通的；
        // function Person(name) {  // 构造函数 
        //     // console.log("??",this);
        //     this.name = name;   //属性
        //     this.age = 20; //属性
        // }
        // // Person.prototype 是构造函数 Person的原型；
        // Person.prototype.hobby = function () {
        //     console.log("喜欢篮球",this.age);
        //     console.log(this.name);
        // }
        // let zhangsan = new Person("张三");
        // zhangsan.hobby();
        // 5.  prototype 是构造函数的原型 ，再实例化之后会变成 __proto__([[Prototype]])
        // function Person(name) {  // 构造函数 
        //     this.name = name;   //属性
        //     this.age = 20; //属性
        // }
        // Person.prototype.hobby = function(){
        //     console.log("喜欢篮球");
        // }
        // // prototype:显式原型  __proto__：隐式原型 (私有),不建议直接操作__proto__
        // // 其实这两个是一个东西 只是名字不同而已
        // let zhangsan = new Person("张三");
        // console.log(zhangsan.__proto__===Person.prototype);

    //   6.识别问题 ，每个prototype上都有一个固有属性（已经定义好的属性）  constructor 指回构造函数 
        function Person(name) {  // 构造函数 
            this.name = name;   //属性
            this.age = 20; //属性
        }  
        console.log( Person.prototype.constructor === Person);



    </script>
</body>

</html>